home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / brutil.arc / WHEREIS.ASM < prev    next >
Encoding:
Assembly Source File  |  1988-04-13  |  17.6 KB  |  778 lines

  1.     TITLE WHEREIS - FIND A FILE ON THE DRIVE
  2. PAGE 60,132
  3.  
  4.     IF1
  5.     INCLUDE OPTMAC.LIB
  6.     ENDIF
  7.     GENOPT    RHSVDA
  8.     GENOPT    LEG
  9.     GENOPT    NX
  10.  
  11. ;-------------------------------------------------------------------------;
  12. ;  This is the format for the DOS data transfer area used when DOS 2.0      ;
  13. ;  searches for a file match in directories.                  ;
  14. ;-------------------------------------------------------------------------;
  15.  
  16. DTA     STRUC
  17.         RESERVED        DB      21 DUP(?)
  18.     ATTRIBUTE    DB    ?
  19.     TIME        DW    ?
  20.     DATE        DW    ?
  21.     SIZE        DD    ?
  22.         NAMFOUND        DB      13 DUP(?)
  23. DTA     ENDS
  24.  
  25. PAGE
  26. CR    EQU    13
  27. LF    EQU    10
  28. ;---------------------------------------------------------------------;
  29. ;  This is the main program that sets up the initial conditions for   ;
  30. ; SCHDIR which, in turn, does a recursive search.          ;
  31. ;                                                                     ;
  32. ; READS: PATNAME                              ;
  33. ; WRITES: FILNAME                                                     ;
  34. ; CALLS: SCHDIR                                               ;
  35. ;---------------------------------------------------------------------;
  36. CODSEG    SEGMENT
  37.     ASSUME    CS:CODSEG,DS:CODSEG
  38.         ORG     100H
  39. WHEREIS PROC    NEAR
  40.     MOV    AX,CS
  41.     MOV    SS,AX
  42.     MOV    SP,OFFSET LOCAL_STACK
  43.     MOV    DS,AX
  44.     MOV    ES,AX
  45.     MOV    BX,OFFSET LOCAL_STACK+15
  46.     MOV    CL,4
  47.     SHR    BX,CL
  48.     MOV    AH,4AH
  49.     INT    21H
  50.     JNC    NOALCERR
  51.     MOV    DX,OFFSET MSG1
  52.     MOV    AH,9
  53.     INT    21H
  54.     INT    20H
  55. NOALCERR:
  56.     MOV    AH,25
  57.     INT    21H
  58.     ADD    AL,'A'
  59.     MOV    PATNAME,AL
  60.     MOV    PATADR,OFFSET PATNAME+2
  61.     MOV    SI,81H            ; start of command line
  62. BYPASSBLANKS:
  63.     LODSB
  64.     CMP    AL,' '
  65.     JZ    BYPASSBLANKS
  66.     MOV    DI,OFFSET FILNAME
  67.     CMP    AL,0DH            ; carriage return character?
  68.     JE    DONREADINNAME        ; yes, end of name
  69.     CMP    AL,'/'            ; slash character?
  70.     JE    DONREADINNAME        ; yes, end of name
  71.     MOV    [DI],AL
  72.     LODSB                ; Get second character
  73.     CMP    AL,':'
  74.     JZ    GETDRV
  75.     DEC    SI
  76.     DEC    SI
  77.     JMP    SHORT GESEARCNAME
  78. GETDRV: MOV    AL,[DI]
  79.     MOV    PATNAME,AL
  80. GESEARCNAME:
  81.     LODSB                ; get first character
  82.     CMP    AL,0DH            ; carriage return character?
  83.     JE    DONREADINNAME        ; yes, end of name
  84.     CMP    AL,'/'            ; slash character?
  85.     JE    DONREADINNAME        ; yes, end of name
  86.     CMP    AL,' '            ; space character?
  87.     JE    DONREADINNAME        ; yes, end of name
  88.     CMP    AL,'\'
  89.     JNE    NOTBAD
  90.     MOV    DI,OFFSET FILNAME
  91.     MOV    DTAFLAG,0
  92.     MOV    DOTFLAG,0
  93.     MOV    EXTFLAG,0
  94.     JMP    GESEARCNAME
  95. NOTBAD:
  96.     CMP    AL,'.'            ; Check for period in file name
  97.     JNE    NOTBAD1
  98.     CMP    DTAFLAG,0
  99.     JNZ    NOTBAD0A
  100.     MOV    BYTE PTR [DI],'*'
  101.     INC    DI
  102. NOTBAD0A:
  103.     STOSB
  104.     MOV    DOTFLAG,AL        ; Set for period in file name
  105.     JMP    GESEARCNAME
  106. NOTBAD1:
  107.     STOSB
  108.     CMP    DOTFLAG,0
  109.     JZ    NOTBAD2
  110.     MOV    EXTFLAG,AL
  111.     JMP    GESEARCNAME
  112. NOTBAD2:
  113.     MOV    DTAFLAG,AL
  114.     JMP    GESEARCNAME
  115. DONREADINNAME:
  116.     CMP    AL,'/'
  117.     JZ    GOTOPT
  118.     JMP    NOTOPT
  119. GOTOPT: LODSB
  120.     AND    AL,5FH
  121.     TESTOP    RHSVDA,GOTA
  122.     TESTOP    LEG,GOTE
  123.     TESTOP    NX,GOTX
  124.     CMP    AL,'F'
  125.     JZ    GOTF
  126.     CALL    TSTVAL
  127.     MOV    AH,AL
  128. NXTLCT: LODSB
  129.     CMP    AL,'/'
  130.     JZ    SETLCT
  131.     CMP    AL,13
  132.     JZ    SETLCT
  133.     CALL    TSTVAL
  134.     MOV    BH,AH
  135.     ADD    AH,AH
  136.     ADD    AH,AH
  137.     ADD    AH,BH
  138.     ADD    AH,AH
  139.     ADD    AH,AL
  140.     JMP    NXTLCT
  141. SETLCT: MOV    LINECT,AH
  142.     MOV    CURLIN,AH
  143.     DEC    SI
  144.     JMP    SHORT NEXTOPT
  145. BADOPT: MOV    DX,OFFSET BOM1
  146.     MOV    AH,9
  147.     INT    21H
  148.     JMP    ABSXIT
  149. GOTA:    OR    MYATTR,AH
  150. NEXTOPT:
  151.     LODSB
  152.     JMP    DONREADINNAME
  153. GOTE:    OR    DFLAG,AH
  154.     JMP    NEXTOPT
  155. GOTX:    OR    OPFLAG,AH
  156.     JMP    NEXTOPT
  157. GOTF:    MOV    PATADR,OFFSET PATNAME
  158.     JMP    NEXTOPT
  159. BOM1    DB    'Bad option selected',CR,LF,'$'
  160. TSTVAL: DEC    SI
  161.     LODSB
  162.     SUB    AL,'0'
  163.     JB    BADOPT
  164.     CMP    AL,9
  165.     JA    BADOPT
  166.     RET
  167. NOTOPT:
  168.     CMP    DFLAG,LOPT+EOPT+GOPT
  169.     JNZ    SETDATE
  170.     MOV    DFLAG,0
  171.     JMP    SHORT SNODATE
  172. SETDATE:
  173.     CMP    DOTFLAG,0
  174.     JNZ    GOTDOT
  175.     CMP    DTAFLAG,0
  176.     JNZ    GOTDTA
  177.     MOV    AL,'*'
  178.     STOSB
  179. GOTDTA:
  180.     MOV    AX,'*.'
  181.     STOSW
  182. GOTDOT:
  183.     CMP    DFLAG,0
  184.     JZ    NODFIX
  185.     MOV    AL,'.'
  186.     STOSB
  187. NODFIX:
  188.     SUB    AL,AL
  189.     STOSB
  190.     CMP    DFLAG,0
  191.     JZ    NODATE
  192.     CMP    DTAFLAG,0
  193.     JNZ    NSDATE
  194.     CALL    GCDATE
  195.     MOV    SI,OFFSET (FILNAME+2)
  196.     JMP    GSDATE
  197. NSDATE:
  198.     MOV    SI,OFFSET FILNAME
  199.     CALL    GTDATE
  200. GSDATE:
  201.     MOV    MYDATE,DX
  202.     CMP    DOTFLAG,0
  203.     JZ    SNODATE
  204.     CMP    EXTFLAG,0
  205.     JNZ    NSDAT2
  206.     CALL    GCDATE
  207.     JMP    GSDAT2
  208. NSDAT2:
  209.     CALL    GTDATE
  210. GSDAT2:
  211.     MOV    MYDAT2,DX
  212. SNODATE:
  213.     MOV    DI,OFFSET FILNAME
  214.     MOV    AX,'.*'
  215.     STOSW
  216.     SUB    AH,AH
  217.     STOSW
  218. NODATE:
  219.     MOV    DI,OFFSET PATNAME
  220.     XOR    AL,AL            ; search directory for the zero at the
  221.     CLD                ; end of PATNAME
  222.     MOV    CX,64            ; max. length of scan for 0
  223.         REPNZ   SCASB
  224.         MOV     BX,DI
  225.     DEC    BX            ; DS:BX points to the end of PATNAME
  226.     MOV    DX,0            ; tell search directory this is first
  227.     CALL    SCHDIR        ; now do the recursive search
  228. ABSXIT:
  229.     MOV    AH,76
  230.     MOV    AL,AFLAG
  231.     INT    21H            ; all done return to DOS
  232. WHEREIS ENDP
  233. PAGE
  234. ;----------------------------------------------------------------;
  235. ;  This procedure searches all the files in the current directory;
  236. ;looking for a match. It also prints the full name of each match ;
  237. ;                                                                ;
  238. ;    DS:BX    pointer to end of current path name.         ;
  239. ;    DS:DX    old disk transfer area (DTA).             ;
  240. ;                                                                ;
  241. ; READS:    disk transfer area                 ;
  242. ; WRITES:    disk transfer area                 ;
  243. ; CALLS:        BLDNAME,GFMATCH,                            ;
  244. ;               WMENAME,GNMATCH,                       ;
  245. ;               BLDSNAME,SCHSDIR                     ;
  246. ;----------------------------------------------------------------;
  247. SCHDIR        PROC    NEAR
  248.     PUSH    SI            ; need to restore on exit
  249.         PUSH    DX
  250.     CALL    BLDNAME        ; build the absolute search name
  251.     CALL    GFMATCH        ; see if there is a match there
  252. FINNEXFILE:
  253.     JC    NMATCH            ; no match check sub directories
  254.     CALL    WMENAME        ; write name of match
  255.     CALL    GNMATCH        ; find the next match
  256.     JMP    FINNEXFILE        ; look for next matching name
  257. NMATCH:
  258.     POP    DX            ; restore DTA
  259.         PUSH    DX
  260.     CALL    BLDSNAME        ; search for all directories
  261.     CALL    GFMATCH        ; get first entry
  262.     MOV    SI,DX            ; put address of DTA in SI
  263. FINNEXDIRECTORY:
  264.     JC    NMORMATCHES        ; there are no entries
  265.     TEST    [SI].ATTRIBUTE,10H    ; is it a directory ?
  266.     JZ    ISNOTADIR    ; no, then find the next match
  267.     CMP    [SI].NAMFOUND,'.'    ; is this a . or .. directory?
  268.     JE    ISNOTADIR        ; yes then skip to next directory
  269.     CALL    SCHSDIR    ; search the sub dir
  270.     PUSH    AX            ; now reset the DTA
  271.         MOV     AH,1AH
  272.         INT     21H
  273.         POP     AX
  274. ISNOTADIR:
  275.     CALL    GNMATCH     ; then find the next match
  276.     JMP    FINNEXDIRECTORY     ; and go back
  277. NMORMATCHES:
  278.         POP     DX
  279.         POP     SI
  280.         RET
  281. SCHDIR        ENDP
  282. PAGE
  283. ;---------------------------------------------------------------;
  284. ; This procedure searches the sub dir whose name is in the DTA    ;
  285. ;                                                               ;
  286. ;    DS:BX    end of current pathname             ;
  287. ;    DS:[DX].NAMFOUND      name of sub dir to search     ;
  288. ;                                                               ;
  289. ; READS:        PATNAME                                         ;
  290. ; WRITES:        PATNAME                                        ;
  291. ; CALLS:        SCHDIR                                  ;
  292. ;---------------------------------------------------------------;
  293. SCHSDIR    PROC    NEAR
  294.         PUSH    DI
  295.         PUSH    SI
  296.         PUSH    AX
  297.         PUSH    BX
  298.     CLD                ; set for increment
  299.     MOV    SI,DX            ; put the address of DTA in SI
  300.     ADD    SI,OFFSET NAMFOUND    ; set to start of sub dir name
  301.     MOV    DI,BX            ; DS:DI - 0 at end of path name
  302. COPLOOP:
  303.     LODSB                ; copy one character
  304.         STOSB
  305.     OR    AL,AL            ; was it a zero
  306.     JNZ    COPLOOP         ; no, keep copying
  307.     MOV    BX,DI            ; set BX to end of new pathname
  308.     STD                ; set flag for decrement
  309.     STOSB                ; store a 0 at end of string
  310.         MOV     AL,'\'
  311.     STOSB                ; place a \ at end of pathname
  312.     CALL    SCHDIR        ; search this new path
  313.     POP    BX            ; restore the old end-of-path
  314.     MOV    BYTE PTR [BX],0     ; and store a zero here
  315.         POP     AX
  316.         POP     SI
  317.         POP     DI
  318.         RET
  319. SCHSDIR    ENDP
  320. PAGE
  321. ;---------------------------------------------------------------;
  322. ;  This procedure prints the matched name after the path name    ;
  323. ;                                                               ;
  324. ;    DS:DX    pointer to current DTA                ;
  325. ;                                                               ;
  326. ; READS:    PATNAME,NAMFOUND (in DTA)            ;
  327. ; CALLS:        WRSTR,CRLF                              ;
  328. ;---------------------------------------------------------------;
  329. WMENAME      PROC    NEAR
  330.         PUSH    AX
  331.     PUSH    DX
  332.     PUSH    DX
  333.     MOV    AL,OPFLAG
  334.     OR    AL,MYATTR
  335.     JZ    NOCHO
  336.     XCHG    BX,DX
  337.     MOV    AL,[BX].ATTRIBUTE
  338.     XCHG    BX,DX
  339.     TEST    BYTE PTR OPFLAG,XOPT
  340.     JZ    NOXACT
  341.     CMP    AL,MYATTR
  342.     JZ    NOCHO
  343.     JMP    NOWRT
  344. NOXACT:
  345.     TEST    BYTE PTR OPFLAG,NOPT
  346.     JZ    NONORM
  347.     TEST    AL,18H
  348.     JZ    NOW1
  349.     JMP    NOWRT
  350. NOW1:
  351.     TEST    BYTE PTR MYATTR,0FFH
  352.     JZ    NOCHO
  353. NONORM:
  354.     TEST    AL,MYATTR
  355.     JNZ    NOCHO
  356.     JMP    NOWRT
  357. NOCHO:
  358.     CMP    DFLAG,0
  359.     JZ    NOCHD
  360.     XCHG    BX,DX
  361.     MOV    AX,[BX].DATE
  362.     XCHG    BX,DX
  363. TEST1:    TEST    BYTE PTR DFLAG,LOPT
  364.     JZ    TEST2
  365.     CMP    DOTFLAG,0
  366.     JZ    TEST1A
  367.     CMP    AX,MYDAT2
  368.     JNA    TEST2
  369. TEST1A: CMP    AX,MYDATE
  370.     JB    NOCHD
  371. TEST2:    TEST    BYTE PTR DFLAG,EOPT
  372.     JZ    TEST4
  373.     CMP    DOTFLAG,0
  374.     JZ    TEST2A
  375.     CMP    AX,MYDAT2
  376.     JZ    NOCHD
  377. TEST2A: CMP    AX,MYDATE
  378.     JZ    NOCHD
  379. TEST4:    TEST    BYTE PTR DFLAG,GOPT
  380.     JZ    TEST8
  381.     CMP    DOTFLAG,0
  382.     JZ    TEST4A
  383.     CMP    AX,MYDAT2
  384.     JNB    TEST8
  385. TEST4A: CMP    AX,MYDATE
  386.     JA    NOCHD
  387. TEST8:
  388.     JMP    SHORT NOWRT
  389. NOCHD:
  390.     POP    DX
  391.         ADD     DX,OFFSET NAMFOUND
  392.         PUSH    DX
  393.     XCHG    BX,DX
  394.     CMP    BYTE PTR [BX],'.'
  395.     XCHG    BX,DX
  396.     JZ    NOWRT
  397.     MOV    DX,PATADR
  398.     MOV    AL,[BX]         ; save char at end of path
  399.     MOV    BYTE PTR [BX],0     ; set for end of string
  400.         CALL    WRSTR
  401.     MOV    [BX],AL         ; restore character
  402.     POP    DX            ; recover old pointer
  403.         PUSH    DX
  404.         CALL    WRSTR
  405.         CALL    CRLF
  406.     MOV    AFLAG,0
  407. NOWRT:    POP    DX
  408.     POP    DX
  409.         POP     AX
  410.         RET
  411. WMENAME      ENDP
  412. PAGE
  413. ;---------------------------------------------------------------;
  414. ;  This procedure builds an absolute search name from PATNAME    ;
  415. ; followed by FILNAME                        ;
  416. ;                                                               ;
  417. ; READS:        FILNAME                                         ;
  418. ; CALLS:    BUILD     to build the name            ;
  419. ;---------------------------------------------------------------;
  420. BLDNAME        PROC    NEAR
  421.         PUSH    SI
  422.     MOV    SI,OFFSET FILNAME
  423.         CALL    BUILD
  424.         POP     SI
  425.         RET
  426. BLDNAME        ENDP
  427. BLDSNAME     PROC    NEAR
  428.         PUSH    SI
  429.     MOV    SI,OFFSET STANAME
  430.         CALL    BUILD
  431.         POP     SI
  432.         RET
  433. BLDSNAME     ENDP
  434. PAGE
  435. ;---------------------------------------------------------------;
  436. ;  This procedure appends the string at DS:SI to PATNAME in    ;
  437. ; PATNAME. It knows where the PATNAME ends from knowing how     ;
  438. ; long PATNAME is.                        ;
  439. ;                                                               ;
  440. ;    DS:SI    name of file                    ;
  441. ;    DS:BX    end of PATNAME                    ;
  442. ;                                                               ;
  443. ; READS:        DS:SI                                           ;
  444. ; WRITES:       PATNAME                                         ;
  445. ;---------------------------------------------------------------;
  446. BUILD   PROC    NEAR
  447.         PUSH    AX
  448.         PUSH    DI
  449.         MOV     DI,BX
  450.     CLD                ; set for increment
  451. COPNAME:
  452.         LODSB
  453.     STOSB                ; copy a character of name
  454.     OR    AL,AL            ; end of string yet?
  455.     JNZ    COPNAME         ; no keep copying
  456.         POP     DI
  457.         POP     AX
  458.         RET
  459. BUILD   ENDP
  460. PAGE
  461. ;------------------------------------------------------------------;
  462. ;  This procedure finds the first match between the name given by  ;
  463. ; DS:DX and the directory entries found in the directory PATNAME   ;
  464. ;                                                                  ;
  465. ;    DS:DX    pointer to current DTA                   ;
  466. ;RETURNS:                                                          ;
  467. ;    CF    0    a match was found               ;
  468. ;        1    no match found                   ;
  469. ;    AX        error code returned:               ;
  470. ;        2    file not found                   ;
  471. ;        18    no more files                   ;
  472. ;    DS:DX        pointer to new DTA               ;
  473. ;                                                                  ;
  474. ; READS:        PATNAME                                            ;
  475. ; WRITES:       DTAREAS                                    ;
  476. ;------------------------------------------------------------------;
  477. GFMATCH PROC    NEAR
  478.         PUSH    CX
  479.     CMP    DX,0        ; first one?
  480.     JA    ALLOCATE    ; no, then allocate space
  481.     MOV    DX,OFFSET DTAREAS-TYPE DTA
  482. ALLOCATE:
  483.     ADD    DX,TYPE DTA    ; no then allocate room for new DTA
  484.     MOV    CX,1FH        ; search attribute for files and sdirs.
  485.     MOV    AH,1AH        ; set DTA
  486.         INT     21H
  487.     PUSH    DX        ; need DX for address of search name
  488.     MOV    DX,OFFSET PATNAME
  489.     MOV    AH,4EH        ; call for find first match
  490.         INT     21H
  491.         POP     DX
  492.         POP     CX
  493.     RET            ; return with carry flag info
  494. GFMATCH     ENDP
  495. PAGE
  496. ;---------------------------------------------------------------;
  497. ; This procedure is much like get first match.            ;
  498. ;                                                               ;
  499. ; RETURNS                                                       ;
  500. ;    CF    0    a match was found            ;
  501. ;        1    no match found                ;
  502. ;    AX        error code returned:            ;
  503. ;        2    file not found                ;
  504. ;        18    no more files                ;
  505. ;                                                               ;
  506. ; READS:        PATNAME                                         ;
  507. ; WRITES:       DTAREAS                                 ;
  508. ;---------------------------------------------------------------;
  509. GNMATCH  PROC    NEAR
  510.         PUSH    CX
  511.         PUSH    DX
  512.     MOV    DX,OFFSET PATNAME
  513.     MOV    CX,1FH        ; attribute for files and directories
  514.     MOV    AH,4FH        ; call for find next match
  515.         INT     21H
  516.         POP     DX
  517.         POP     CX
  518.     RET            ; return with carry flag intact
  519. GNMATCH      ENDP
  520. PAGE
  521. ;---------------------------------------------------------------;
  522. ; This proc send a crlf to the screen                ;
  523. ;---------------------------------------------------------------;
  524. CRLF         PROC    NEAR
  525.         PUSH    AX
  526.         PUSH    DX
  527.     MOV    AH,2
  528.     MOV    DL,CR
  529.         INT     21H
  530.     MOV    DL,LF
  531.         INT     21H
  532.     CMP    LINECT,0
  533.     JZ    XCRLF
  534.     DEC    CURLIN
  535.     JNZ    XCRLF
  536.     MOV    AH,LINECT
  537.     MOV    CURLIN,AH
  538.     MOV    AH,7
  539.     INT    21H
  540.     CMP    AL,3
  541.     JNZ    L0366
  542.     JMP    ABSXIT
  543. L0366:    AND    AL,5FH
  544.     CMP    AL,'S'
  545.     JNZ    XCRLF
  546.     POP    DX
  547.     PUSH    DX
  548.     JMP    SHELL
  549. XCRLF:
  550.         POP     DX
  551.         POP     AX
  552.         RET
  553. CRLF         ENDP
  554. ;---------------------------------------------------------------;
  555. ; This proc writes the ASCIIZ string at             ;
  556. ; DS:DX     address of ASCIIZ                ;
  557. ;---------------------------------------------------------------;
  558. WRSTR      PROC    NEAR
  559.         PUSH    AX
  560.         PUSH    DX
  561.         PUSH    SI
  562.     CLD                ; set for increment
  563.     MOV    SI,DX            ; set pointer to string
  564.         MOV     AH,2
  565.         LODSB
  566. WRITSTRINLOOP:
  567.         MOV     DL,AL
  568.     INT    21H            ; write the char
  569.         LODSB
  570.     OR    AL,AL            ; end of string?
  571.         JNZ     WRITSTRINLOOP
  572.         POP     SI
  573.         POP     DX
  574.         POP     AX
  575.         RET
  576. WRSTR    ENDP
  577.  
  578. GCDATE: MOV    AH,42
  579.     INT    21H
  580.     SUB    CX,1980
  581.     MOV    AX,CX
  582.     MOV    CL,4
  583.     SHL    AX,CL
  584.     MOV    CL,DH
  585.     OR    AX,CX
  586.     MOV    CL,5
  587.     SHL    AX,CL
  588.     SUB    DH,DH
  589.     OR    DX,AX
  590.     RET
  591. GTDATE: CALL    GETVAL
  592.     OR    DX,DX
  593.     JZ    BADDAT
  594.     CMP    DX,13
  595.     JNC    BADDAT
  596.     MOV    CL,5
  597.     ROL    DX,CL
  598.     MOV    BX,DX
  599.     CALL    GETVAL
  600.     OR    DX,DX
  601.     JZ    BADDAT
  602.     CMP    DX,32
  603.     JNC    BADDAT
  604.     OR    BX,DX
  605.     CALL    GETVAL
  606.     CMP    DX,100
  607.     JNC    NOADD19
  608.     ADD    DX,1900
  609. NOADD19:
  610.     SUB    DX,1980
  611.     CMP    DX,120
  612.     JNC    BADDAT
  613.     MOV    CL,9
  614.     ROL    DX,CL
  615.     OR    DX,BX
  616.     RET
  617. BADDAT:    MOV    DX,OFFSET BDM1
  618.     MOV    AH,9
  619.     INT    21H
  620.     JMP    ABSXIT
  621. BDM1    DB    'Bad date',13,10,'$'
  622. GETVAL:    SUB    DX,DX
  623.     SUB    AH,AH
  624. GV1:    LODSB
  625.     CMP    AL,'.'
  626.     JZ    GVX
  627.     CMP    AL,'-'
  628.     JZ    GVX
  629.     SUB    AL,'0'
  630.     CMP    AL,10
  631.     JNC    GVEX
  632.     MOV    CX,DX
  633.     ADD    DX,DX
  634.     ADD    DX,DX
  635.     ADD    DX,CX
  636.     ADD    DX,DX
  637.     ADD    DX,AX
  638.     JMP    GV1
  639. GVEX:    MOV    DX,-1
  640. GVX:    RET
  641. SHELL:    PUSH    AX
  642.     PUSH    BX
  643.     PUSH    CX
  644.     PUSH    DX
  645.     PUSH    SI
  646.     PUSH    DI
  647.     PUSH    BP
  648.     MOV    CX,BX
  649.     MOV    SI,OFFSET PATNAME
  650.     MOV    DI,OFFSET (CMDDTA+1)
  651.     SUB    CX,SI
  652.     PUSH    CX
  653.     PUSH    DX
  654.     CALL    SENDEM
  655.     POP    SI
  656.     MOV    CX,12
  657.     CALL    SENDEM
  658.     MOV    BYTE PTR [DI],CR
  659.     MOV    AX,12
  660.     SUB    AX,CX
  661.     POP    CX
  662.     ADD    AX,CX
  663.     MOV    CMDDTA,AL
  664.     MOV    AH,47
  665.     INT    21H
  666.     PUSH    BX
  667.     MOV    STKPTR,SP
  668.     MOV    AX,CS
  669.     MOV    PARBLK+4,AX
  670.     MOV    PARBLK+8,AX
  671.     MOV    PARBLK+12,AX
  672.     MOV    DX,OFFSET MSG4
  673.     MOV    AH,9
  674.     INT    21H
  675.     MOV    DX,OFFSET CMDBUF
  676.     MOV    AH,10
  677.     INT    21H
  678.     MOV    DL,LF
  679.     MOV    AH,2
  680.     INT    21H
  681.     MOV    AL,CMDDTA
  682.     MOV    CMDLIN,AL
  683.     OR    AL,AL
  684.     JZ    NOSETUP
  685.     MOV    SI,OFFSET PREFMSG
  686.     MOV    DI,OFFSET CMDLIN
  687.     ADD    AL,4
  688.     STOSB
  689.     MOVSW
  690.     MOVSW
  691. NOSETUP:
  692.     MOV    AX,DS:[2CH]
  693.     MOV    DS,AX
  694.     MOV    SI,0
  695.     MOV    DI,OFFSET COMSPEC
  696. LOOP1:    PUSH    DI
  697.     PUSH    SI
  698.     MOV    CX,4
  699.     REP    CMPSW
  700.     JZ    GOTSPEC
  701.     POP    SI
  702.     POP    DI
  703. LOOP2:    LODSB
  704.     OR    AL,AL
  705.     JNZ    LOOP2
  706.     MOV    AL,[SI]
  707.     OR    AL,AL
  708.     JNZ    LOOP1
  709.     MOV    AX,CS
  710.     MOV    DS,AX
  711.     MOV    DX,OFFSET MSG2
  712.     MOV    AH,9
  713.     INT    21H
  714.     INT    20H
  715. GOTSPEC:
  716.     POP    DI
  717.     POP    DI
  718.     MOV    DX,SI
  719.     MOV    BX,OFFSET PARBLK
  720.     MOV    AX,4B00H
  721.     INT    21H
  722.     MOV    AX,CS
  723.     MOV    SS,AX
  724.     MOV    SP,CS:STKPTR
  725.     MOV    DS,AX
  726.     MOV    ES,AX
  727.     POP    DX
  728.     MOV    AH,26
  729.     INT    21H
  730.     POP    BP
  731.     POP    DI
  732.     POP    SI
  733.     POP    DX
  734.     POP    CX
  735.     POP    BX
  736.     POP    AX
  737.     JMP    XCRLF
  738. SENDEM: LODSB
  739.     OR    AL,AL
  740.     JZ    NOSEND
  741.     STOSB
  742.     LOOP    SENDEM
  743. NOSEND: RET
  744. LINECT    DB    0
  745. CURLIN    DB    0
  746. STKPTR    DW    ?
  747. MSG1    DB    'Unable to release memory.$'
  748. COMSPEC DB    'COMSPEC='
  749. MSG2    DB    'COMSPEC must be set$'
  750. PARBLK    DW    0,CMDLIN,?,FCB1,?,FCB2,?
  751. CMDLIN    DB    0,CR,0
  752. CMDBUF    DB    128
  753. CMDDTA    DB    0,CR,0,128 DUP(?)
  754. PREFMSG DB    ' /C '
  755. MSG4    DB    13,'Enter command for shell operation.',CR,LF,'*$'
  756. FCB1    DB    0,11 DUP('?'),25 DUP(0)
  757. FCB2    DB    0,11 DUP(' '),25 DUP (0)
  758. MYDATE    DW    0
  759. MYDAT2 DW    0
  760. MYATTR    DB    0
  761. OPFLAG    DB    0
  762. DFLAG    DB    0
  763. PATADR    DW    ?
  764. DOTFLAG DB    0
  765. DTAFLAG DB    0
  766. EXTFLAG DB    0
  767. AFLAG    DB    1
  768. STANAME       DB      '*.*',0
  769. PATNAME DB    ' :\',0
  770.           DB      80 DUP (0)      ; space for 64 char path name
  771.                     ; and 13 char file name
  772.                     ; or 2 8 char dates
  773. FILNAME     DB    19 DUP (0)    ; save room for full DOS name
  774. DTAREAS       LABEL   BYTE    ; this starts at the end of the whereis
  775. LOCAL_STACK    EQU    DTAREAS+2048
  776. CODSEG        ENDS
  777.     END    WHEREIS
  778.       LABEL   BYTE    ; this starts at the end of